<?php

class Rating_Bd {

 
	// Initialisation d'un objet rating à partir d'un id_user et d'un id_title
	public static function getRating($id_user,$id_title) {  
		/* creer la connection BD */
		$db = Outils_Bd::getInstance()->getConnexion();
		/* preparer le requete */
		$sth=$db->prepare("SELECT * FROM Rating WHERE id_user=:id_user AND id_title=:id_title");
		/* recuperer les donnes */
		$data=array('id_user' => $id_user, 'id_title' => $id_title);
		/* executer la requete */
		$sth->execute($data);
		/* recuperer le resultat */
		$ligne = $sth->fetch(PDO::FETCH_ASSOC);
	
		/*retourner un objet Rating */
		return new Rating($ligne);
  
  	}
	
		// Initialisation d'un objet rating à partir d'un id_rating
	public static function getRatingById($id_rating) {  
		/* creer la connection BD */
		$db = Outils_Bd::getInstance()->getConnexion();
		/* preparer le requete */
		$sth=$db->prepare("SELECT * FROM Rating WHERE id_rating=:id_rating");
		/* recuperer les donnes */
		$data=array('id_rating' => $id_rating);
		/* executer la requete */
		$sth->execute($data);
		/* recuperer le resultat */
		$ligne = $sth->fetch(PDO::FETCH_ASSOC);
	
		/*retourner un objet Rating */
		return new Rating($ligne);
  
  	}
	
	
	// Méthode addRating($rating) : ajoute une évaluation dans la table Rating
	static public function addRating($rating) { 
 
		$db = Outils_Bd::getInstance()->getConnexion();
		$sth=$db->prepare("INSERT INTO Rating ( method_recommendation, score, id_title, id_user, time ) VALUES ( :method_recommendation, :score, :id_title, :id_user, :time )");
		$sth2=$db->prepare("SELECT * FROM Rating WHERE id_rating=LAST_INSERT_ID()");
		$data=array(
			'method_recommendation' => $rating->getMethodRecommendation(),
			'score' => $rating->getScore(),
			'id_title' => $rating->getIdTitle(),
			'id_user' => $rating->getIdUser(),
			'time' => $rating->getTime()
			);
	
		$sth->execute($data);
		$sth2->execute();
		$ligne = $sth2->fetch(PDO::FETCH_ASSOC);
		return new Rating($ligne);
	}


  // Méthode modifyRating($rating) : modifie une évaluation donnée
   static public function modifyRating($rating) { 
  
		$db = Outils_Bd::getInstance()->getConnexion();
		$sth=$db->prepare("UPDATE Rating SET method_recommendation=:method_recommendation, score=:score,time=:time WHERE id_rating=:id ");
		$data=array(
			'id' => $rating->getIdRating(),
			'method_recommendation' => $rating->getMethodRecommendation(),
			'score' => $rating->getScore(),
			'time' => $rating->getTime()
		);

		$sth->execute($data);
	}


  // Methode count
    public static function count($clause="1=1", $data=array()) {
		
	  $db = Outils_Bd::getInstance()->getConnexion();
	  $sth=$db->prepare("SELECT count(*) as totalItems FROM Rating WHERE {$clause}");
	  $sth->execute($data);
	  $ligne = $sth->fetch(PDO::FETCH_ASSOC);
	  return $ligne['totalItems'];
  }
  
  // Methode lireListe
  
	public static function lireListe($clause, $data=array()) {  
	 
		$db = Outils_Bd::getInstance()->getConnexion();
		
		$requete = "SELECT * FROM Rating WHERE {$clause}";
		
		if (isset($data['offset'])) {
			$requete .=	" LIMIT {$data['offset']}, {$data['itemsPerPage']}";
			unset($data['offset']);
			unset($data['itemsPerPage']);
		}

		$sth=$db->prepare($requete);
		
		$sth->execute($data);	
		$liste = array();
		// recuperer les resultats
		while (($ligne = $sth->fetch(PDO::FETCH_ASSOC)) !== false) {
		  	// ajouter un objet Rating dans le tableau
		  	$liste[] = new Rating($ligne);
		}
		return $liste;
	}
	
	// Méthode getNbCommonScore($id_user1,$id_user2,$scoreClause); Renvoit un nombre correspondant au nombre de note commun aux deux utilisateurs
	
	public static function getNbCommonScore($id_user1,$id_user2,$scoreClause){
		$db = Outils_Bd::getInstance()->getConnexion();
		$requete = "SELECT COUNT(*) as common FROM Rating r1 INNER JOIN Rating AS r2 ON r2.id_title=r1.id_title WHERE r1.id_user=:id_user1 AND r2.id_user=:id_user2";
		$data = array('id_user1' => $id_user1, 'id_user2' => $id_user2);
		$requete .= $scoreClause;
		$sth=$db->prepare($requete);
		$sth->execute($data);
		$ligne = $sth->fetch(PDO::FETCH_ASSOC);
	  	return $ligne['common'];
	}











/* Les n dernieres annonces */
public static function lireDernieres($n=10) {  
   
    /* prendre la connection BD */
    $db = Outils_Bd::getInstance()->getConnexion();
    /* preparer le requete */
    $sth=$db->prepare("SELECT * FROM Annonces WHERE confirmation=1 AND type='perdu' AND statut=0 ORDER BY dateIns DESC LIMIT 0, {$n}");

    /* executer la requete */
    $sth->execute();
	
	$liste = array();
    /* recuperer les resultats */
    while (($ligne = $sth->fetch(PDO::FETCH_ASSOC)) !== false) {
      /* ajouter un objet Image dans le tableau */
      $liste[] = Annonce::initialize($ligne);
    }

    return $liste;
  }
  
 

  /* Methodes getFichiers qui retournent une liste d'objet de fichiers */
  public static function getFichiers($id) {
    $db = Outils_Bd::getInstance()->getConnexion();
    $sth=$db->prepare("SELECT * FROM Fichier WHERE idAnnonce=:id");
    $data=array('id' => $id);
    $sth->execute($data);
    $ligne = $sth->fetchAll(PDO::FETCH_ASSOC);
    $liste = array();
    foreach ($ligne as $item) {
      $liste[] = Fichier::initializeFromData($item);
    }
    return $liste;

  }
  
/* Methodes getLieu qui retourne objet de Lieu */ 
  public static function getLieu($id) {  
    /* creer la connection BD */
    $db = Outils_Bd::getInstance()->getConnexion();
    /* preparer le requete */
    $sth=$db->prepare("SELECT * FROM Lieu WHERE idAnnonce=:id");
    /* recuperer les donnes */
    $data=array('id' => $id);
    /* executer la requete */
    $sth->execute($data);
    /* recuperer le resultat */
    $ligne = $sth->fetch(PDO::FETCH_ASSOC);

    /*retourner un objet Annonce */
    return Lieu::initialize($ligne);

}







  /* Méthode supprimer : faire la requête DELETE en BD 
   * même principe que précédement pour les exceptions
  */
 static public function supprimer($annonce) {
     
     /* creer la connection BD */
    $db = Outils_Bd::getInstance()->getConnexion();
    /* preparer le requete */
    $reqone=$db->prepare("delete from Annonces where idAnnonce=:id");
    $reqtwo=$db->prepare("delete from Fichier where idAnnonce=:id");
	$reqtree=$db->prepare("delete from Lieu where idAnnonce=:id");
    /* recuperer les donnes */
    $data=array('id' => $annonce->getIdAnnonce());
    /* executer la requete */
    $reqone->execute($data);
    $reqtwo->execute($data);
	$reqtree->execute($data);
  

  }
  
 /* Méthode qui récolte les Annonces vides */

 static public function getVide() {
     
     /* creer la connection BD */
    $db = Outils_Bd::getInstance()->getConnexion();
    $sth=$db->prepare("SELECT idAnnonce FROM Annonces WHERE confirmation=:confirmation");
    $data=array('confirmation' => "0");
    $sth->execute($data);
    $ligne = $sth->fetchAll(PDO::FETCH_ASSOC);
  return $ligne;

  }




} // fin class Annonce_Bd
?>